package utils

import (
	"fmt"
	"go.uber.org/zap"
	"net/smtp"
	"strings"
	"time"
	. "yunwei/go_api/application/config"
)

// 定义邮件结构体
type Email struct {
	// 邮件主题
	Subject string
	// 邮件内容
	Body string
	// 发送人
	To string
	// 邮件解析格式
	Format string
}

// 定义全局变量
var (
	// 邮件管道
	emailChan chan *Email
)

// 1.读配置，组装邮件对象
// 2.创建邮件管道
// 3.开启子协程，监听邮件管道，来数据发邮件
func InitEmail(emailConfig *EmailConfig) {
	fmt.Println("emailConfig:::", emailConfig)
	host := emailConfig.Host
	port := emailConfig.Port
	//from := emailConfig.From
	username := emailConfig.User
	password := emailConfig.Pwd
	poolSize := 10
	// 2.创建邮件管道
	emailChan = make(chan *Email, poolSize)
	// 3.开启子协程，监听邮件管道，来数据发邮件
	go func() {
		for {
			// 监听管道数据
			select {
			case email, ok := <-emailChan:
				if !ok {
					return
				}
				// 发邮件的逻辑
				// 设置发送方邮箱用户名。。。前提是开启了SMTP
				fmt.Println("PPP:::", username, password, host)
				auth := smtp.PlainAuth("", username, password, host)
				fmt.Println("auth:::", auth)
				// 处理发送给谁
				sendTo := strings.Split(email.To, ";")
				fmt.Println("sendTo:::", sendTo)
				// 设置邮箱的解析格式
				var contentType string
				if email.Format == "" {
					contentType = "Content-Type:text/plain;charset=UTF-8"
				} else {
					contentType = "Content-Type: " + email.Format + ";charset=UTF-8"
				}
				msg := []byte("To: " + email.To + "\r\nFrom: " + username +
					"\r\nSubject: " + email.Subject + "\r\n" + contentType + "\r\n" + email.Body)
				// 发送邮件
				err := smtp.SendMail(host+":"+port, auth, username, sendTo, msg)
				fmt.Println("err:::", err)
				if err != nil {
					zap.S().Error("SendEmail:", err.Error())
				}
			}
		}
	}()
}

// 提供一个其他包调用的发邮件的方法
// 1.邮件接收方
// 2.邮件摘要/标题
// 3.邮件内容
// 4.邮件格式
func SendToChan(to, subject, body, mailtype string) bool {
	// 组装对象
	email := &Email{
		Body:    body,
		Subject: subject,
		Format:  mailtype,
		To:      to,
	}
	select {
	case emailChan <- email:
		return true
	case <-time.After(time.Second * 3):
		return false
	}
}
